home *** CD-ROM | disk | FTP | other *** search
-
-
- SetFunction Manager
-
- SetMan / SetManager V1.0
-
-
- Copyright © 1991,1992 by
-
- Nicola Salmoria
- Via Piemonte 11
- 53100 Siena ITALY
-
- Internet: mc6489@mclink.it
-
-
- Questo programma e` FREEWARE. NON e`, e non sara` mai, di pubblico dominio.
- Copiatelo quanto potete (purche` non venga fatto pagare, e purche` l'archivio
- venga lasciato intatto). Non puo` essere incluso in alcun programma commerciale
- senza autorizzazione scritta dell'autore.
-
-
-
- UTENTI INESPERTI
- ----------------
- Il programma 'SetMan' andrebbe messo nella directory C: e eseguito come primo
- comando della startup-sequence. Quando dico primo, intendo PRIMO!! Va eseguito
- anche prima di SetPatch.
-
- Se non siete esperti del sistema operativo di Amiga, tutto quello che avete
- bisogno di sapere su SetMan e` che, in certe circostanze, evita dei GURU.
- COntinuate a leggere per maggiori informazioni.
-
-
-
- UTENTI ESPERTI
- --------------
- Entriamo nei dettagli. C'e` una funzione nella exec.library, il cui nome e`
- SetFunction(). Saprete che le librerie di Amiga contengono una 'jump table', in
- cui sono memorizzati gli indirizzi di tutte le funzioni della libraria. Le
- funzioni sono sempre eseguite attraverso la jump table, e MAI con indirizzi
- assoluti.
- SetFunction() permette all'utente di modificare la jump table, in modo da
- inserire una funzione personalizzata al posto di quella standard.
- Per esempio, uno potrebbe modificare il vettore di DisplayBeep() per sostituire
- un messaggio sonoro al lampeggio dello schermo.
-
- SetFunction() e` una caratteristica molto utile del sistema operativo di Amiga,
- ma ha il grosso inconveniente che non c'e` una supervisione da parte del sistema
- operativo sull'uso contemporaneo delo stesso vettore da parte di programmi
- diversi. In certe circostanze, questo puo` essere letale.
- Prima di rimuovere il proprio vettore personalizzato, un programma dovrebbe
- controllare che questo non sia stato modificato di nuovo. Pero` in pochi lo
- fanno, e quindi se non si terminano tali programmi in ordine INVERSO a quando si
- sono eseguiti, probabilmente si causa un blocco del sistema.
-
- Un altro guaio del KickStart 1.x e` che i vettori della dos.library non possono
- essere modificati da SetFunction(), perche` non seguono le convenzioni stabilite
- dalla stessa Commodore.
-
- SetMan modifica il vettore di SetFunction(), e inserisce una sua routine che
- risolve entrambi i problemi precedenti. Mantiene una lista concatenata di tutti
- i cambiamenti alle jump tables, e permette a qualsiasi programma di rimuovere il
- proprio vettore in qualsiasi momento.
- Inoltre, permette di modificare i vettori della dos.library in modo trasparente
- e compatibile verso l'alto.
-
-
- In questo archivio c'e` un altro regalo, il cui nome e` SetManager. SetManager
- mostra la lista di tutti i vettori modificati, conil nome del programma che ha
- inserito la sua funzione personalizzata, l'indirizzo di tale funzione, e lo
- stato attuale.
- Lo stato sara` normalmente 'active'; cliccando sul nome della funzione, la si
- puo` disabilitare, rimuovendo quindi la routine personalizzata. Il terzo stato
- possibile e` 'removed', che capita solo quando non si terminano programmi nel
- corretto ordine che ho spiegato prima. E` visualizzato per informazione, ma non
- causa assolutamente nessun problema. Quando si termina l'altro programma che usa
- lo stesso vettore, entrambi spariranno dalla lista.
-
- NOTA: i vettori modificati sono mostrati come 'scostamento' 'nome libraria'.
- SetManager e` pero` in grado di leggere i file standard 'xxx_lib.fd', forniti
- dalla Commodore nel disco 'Extras'. Basta assegnare il nome logico 'FD:' alla
- directory che contiene i file .fd, e questi verranno letti e interpretati al
- caricamento di SetManager. In questo modo, si avranno i veri nomi delle funzioni
- invece degli scostamenti.
-
-
-
- PROGRAMMATORI
- -------------
- Suggerisco caldamente di usare le possibilita` offerte da SetMan per modificare
- i vettori della dos.library.
- Per sapere se SetMan e` attivo, tutto quel che bisogna fare e` cercare un
- MsgPort pubblico di nome "SetMan". Cio` e` necessario solo con KickStart 1.x,
- perche` dalla vrsione 2.0 del sistema operativo la dos.library e` diventata una
- libraria come tutte le altre. Comunque, SetMan e` abbastanza intelligente da
- usare la routine scritta appositamente per la dos.library solo se questa e`
- realmente la versione non standard.
- Ecco un esempio di come procedere:
-
- -----------------------
-
- if (DOSBase->dl_lib.lib_Version < 36 && !FindPort("SetMan"))
- {
- printf("You need SetMan to execute this program!\n");
- exit(RETURN_WARN);
- }
- else
- {
- TrueFunction = SetFunction((struct Library *)DOSBase,FUNCOFFSET,NewFunction);
-
- etc etc.....
- }
-
- -----------------------
-
-
-
- BUG AND INCOMPATIBILITA`
- ------------------------
- Non ci sono bug noti in questa versione di SetMan.
-
- Qualche parola in piu` va spesa sui problemi di compatibilita`.
- A causa delle procedure molto differenti usate da SetFunction() e da SetMan,
- non mi e` possibile garantire una compatibilita` al 100% con qualsiasi programma
- in giro. Ogni sforzo e` stato fatto per evitare tutti i problemi possibili;
- SetMan gestisce correttamemte tutti i comportamenti strani che mi sono venuti in
- mente; l'unico modo per confondere SetMan dovrebbe essere usare due programmi
- separati comunicanti tra di loro tramite un MsgPort e fare cose molto strane.
- Sono praticamente sicuro che tali cose non dovrebbero mai accadere.
-
- Ho incontrato un problema con un programma di nome 'TurboTopaz', che si rifiuta
- di terminare dicendo che 'il vettore e` stato modificato'. Questo e` vero,
- perche` SetMan inserisce una sua funzione prima di quella personalizzata; se
- TurboTopaz usasse SetFunction(), riceverebbe come valore di ritorno quello che
- si aspetta, invece legge direttamente la jump table, una cosa che credo non sia
- garantita dalla Commodore.
-
- Io uso molti programmi che chiamano SetFunction(), e nessuno di essi ha problemi
- con SetMan.
-
-
-
- RINGRAZIAMENTO
- --------------
- Vorrei ringraziare Marco Ciuchini che mi ha indicato un importante problema di
- incompatibilita` che sono riuscito ad eliminare completamente.
-